#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

//声明一个结构体类型
//声明一个学生类型，是想通过学生类型来创建学生变量（对象）
//描述学生：属性-名字+电话+性别

//struct Stu
//{
//	char name[20];//名字
//	char tele[12];//电话
//	char sex[10];//性别
//	int age;//年龄
//}s4,s5,s6;
//
//struct Stu s3;//全局变量
//
//int main()
//{
//	//创建的结构体变量
//	struct Stu s1;
//	struct Stu s2;
//
//	return 0;
//}

//struct
//{
//	int a;
//	char c;
//}sa;
//
//struct
//{
//	int a;
//	char c;
//}* psa;
//
//int main()
//{
//	psa = &sa;
//	return 0;
//}

//结构体的自引用
//struct Node
//{
//	int data;//4
//	struct Node* next;//4/8
//};
//
//int main()
//{
//	sizeof(struct Node);
//	return 0;
//}

//typedef struct Node
//{
//	int data;//4
//	struct Node* next;//4/8
//}Node;
//
//int main()
//{
//	struct Node n1;
//	Node n2;
//
//	return 0;
//}

//struct T
//{
//	double weight;
//	short age;
//};
//
//struct S
//{
//	char c;
//	struct T st;
//	int a;
//	double d;
//	char arr[20];
//};
//
//int main()
//{
//	//struct S s = { 'c', 100, 3.14, "hello world" };
//	struct S s = { 'c', {55.6, 30}, 100, 3.14, "hello world" };
//
//	//printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);
//	printf("%lf\n", s.st.weight);
//	return 0;
//}

//struct S1
//{
//	char c1;
//	int a;
//	char c2;
//};
//
//struct S2
//{
//	char c1;
//	char c2;
//	int a;
//};
//
//struct S3
//{
//	double d;
//	char c;
//	int i;
//};
//
//struct S4
//{
//	char c1;
//	struct S3 s3;
//	double d;
//};
//
//
//int main()
//{
//	struct S1 s1 = { 0 };
//	//printf("%d\n", sizeof(s1));
//
//	struct S2 s2 = { 0 };
//	//printf("%d\n", sizeof(s2));
//
//	struct S3 s3 = { 0 };
//	//printf("%d\n", sizeof(s3));
//
//	struct S4 s4 = { 0 };
//	printf("%d\n", sizeof(s4));
//
//	return 0;
//}

//设置默认对齐数为4
//#pragma pack(4)
//
//struct S
//{
//	char c1;//1
//	//3
//	double d;//8 4 4
//};
//#pragma pack()
//取消设置默认对齐数

#pragma pack(1)

//struct S
//{
//	char c1;//1
//	//3
//	double d;//8 4 4
//};
//#pragma pack()
//
//
//int main()
//{
//	struct S s;
//	printf("%d\n", sizeof(s));//12
//	return 0;
//}

#include <stddef.h>

struct S
{
	char c;//0
	int i;//4
	double d;//8
};

int main()
{
	//offsetof();
	printf("%d\n", offsetof(struct S, c));
	printf("%d\n", offsetof(struct S, i));
	printf("%d\n", offsetof(struct S, d));

	return 0;
}